/**
 * @file UART.h
 * @author bean (813023818@qq.com)
 * @brief 
 * @version 0.1
 * @date 2023-01-05
 * 
 * @copyright Copyright (c) 2023
 * 
 */
#pragma once
#include <iostream>
#include "systemc.h"
#define BPS_CNT (50000000 / 9600) // 波特率9600

/*
 *端口声明
 *进行声明
 */
SC_MODULE(UART0)
{
    sc_in<bool> clk, start_flag, sys_rst_n; // 时钟、起始标识、复位信号
    sc_in<sc_bv<8>> q;                      // 8位数据的输入
    sc_out<bool> tx_flag;                   // 发送过程标志，高电平则是发送数据的状态
    sc_out<sc_bv<8>> q_output;              // 右移一位后的结果
    sc_out<sc_bv<1>> uart_txd;              // 发送的1位数据，起始位、第0位，...，第8位，终止位

    sc_signal<sc_bv<8>> tx_data;
    sc_signal<sc_uint<4>> tx_cnt;
    sc_signal<sc_uint<15>> bps_cnt;
    void prc_outputs(); // 组合逻辑
    void BPS_TIMER();   // 计数，即clock与波特率的转换
    void load_data();   // 加载输入数据（时序逻辑）

    SC_CTOR(UART0)
    {
        SC_METHOD(prc_outputs);                               // 组合逻辑，把各个敏感信号都列出来哦
        sensitive << tx_cnt << start_flag << sys_rst_n.neg(); //<<current_state<< reg_enable << cnt_enable

        SC_METHOD(load_data);                                            // 同上
        sensitive << start_flag << tx_cnt << bps_cnt << sys_rst_n.neg(); //<< count
        SC_METHOD(BPS_TIMER);                                            // 时序逻辑，敏感信号至于时钟有关
        sensitive << clk.pos() << sys_rst_n.neg();
    }
};